/*******************************************************************************
 * Copyleft (c) 2021 Kcode
 *
 * @file    cmos_ov7740_dev.c
 * @brief   cmos_0v7740摄像头的设备文件
 * @author  K
 * @version 0.0.1
 * @date    2021-07-26
 * @license MulanPSL-1.0
 *
 * 文件修改历史：
 * <时间>       | <版本>    | <作者>  | <描述>
 * 2021-07-29   | v0.0.1    | Kcode   | cmos_0v7740摄像头的设备文件
 * -----------------------------------------------------------------------------
 ******************************************************************************/

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/i2c.h>
#include <linux/err.h>
#include <linux/regmap.h>
#include <linux/slab.h>

/*!
 * 板载的I2C设备信息
 * cmos_ov7740为设备名字
 * 0x21为设备地址
 *      写 -- 0x42(01000010)
 *      读 -- 0x43(01000011)
 *      8bit的地址 = 7bit设备地址 + 1bit的读/写控制位
 *      设备地址 = 0100001 = 0x21
 */
static struct i2c_board_info s_cmos_ov7740_info = {	
	I2C_BOARD_INFO("cmos_ov7740", 0x21),
};

/* 用来挂接与适配器匹配成功的从设备i2c_client的一个链表头 */
static struct i2c_client *s_cmos_ov7740_client;

/*
 * @brief  cmos_ov7740_dev注册函数（入口函数）
 * @return  0：成功 -1：失败
 */
 static int cmos_ov7740_dev_init(void)
 {
    struct i2c_adapter *i2c_adap;  /**< 适配器 */

    /* 获取设备号为0的adpter，也就是adapter->nr == 0 */
	i2c_adap = i2c_get_adapter(0);


    /*!
     * 直接使用 i2c_new_device创建client自动注册到i2c_bus_type中去，
     * client->name == "cmos_ov7740" ,client->addr = 0x21 
     */
    s_cmos_ov7740_client = i2c_new_device(i2c_adap, &s_cmos_ov7740_info);

    /* 使用完后需要释放 */
    i2c_put_adapter(i2c_adap);  

    return 0;
 }

/*
 * @brief  cmos_ov7740_dev退出函数（出口函数）
 * @return  无
 */
static void cmos_ov7740_dev_exit(void)
{
     i2c_unregister_device(s_cmos_ov7740_client);
}

/* 修饰 */
module_init(cmos_ov7740_dev_init);
module_exit(cmos_ov7740_dev_exit);

/* 协议 */
MODULE_LICENSE("GPL");


